home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
devs
/
new8n1
/
copmqr28.lha
/
source
/
testit.c
< prev
Wrap
C/C++ Source or Header
|
1994-06-12
|
9KB
|
389 lines
#include "testit.h"
void *oldcms,
*newcms,
*oldcmq,
*newcmq,
*naught;
char *buf1,
*buf2,
*buf3,
*buf4;
ULONG identity;
BOOL negative;
void *TimerBase;
struct MsgPort *tport;
struct timerequest *treq;
struct timeval tim1,
tim2,
tim3,
timold,
timdif,
totold,
totnew;
extern struct ExecBase *SysBase;
#define S0_D0 0
#define S0_D1 1
#define S0_D2 2
#define S0_D3 3
#define S1_D0 4
#define S1_D1 5
#define S1_D2 6
#define S1_D3 7
#define S2_D0 8
#define S2_D1 9
#define S2_D2 10
#define S2_D3 11
#define S3_D0 12
#define S3_D1 13
#define S3_D2 14
#define S3_D3 15
void printoffset(unsigned short alignment);
#pragma regcall(printoffset(d0))
void testit(unsigned long loops,unsigned long bytes,long offset);
#pragma regcall(testit(d0,d1,a0))
long main(void)
{
#asm
movea.l (4).w,a0
move.l _LVOCopyMem#+2(a0),a1
move.l a1,_newcms
move.l _LVOCopyMemQuick#+2(a0),_newcmq
move.l -4(a1),_identity
move.l -8(a1),_oldcms
move.l -12(a1),_oldcmq
lea _donaught#,a0
move.l a0,_naught
#endasm
if (SysBase->LibNode.lib_Version < 37)
{
Write(Output(),"You need 2.0 to run this program!\n",34);
goto warn;
}
if (identity != '*Art')
{
Printf("You must run CopyMemQuicker first!\n");
warn: return 5;
}
tport = CreatePort("cmemtest",0);
treq = (struct timerequest *)CreateExtIO(tport,(LONG)sizeof(struct timerequest));
OpenDevice("timer.device",UNIT_VBLANK,(struct IORequest *)treq,0);
TimerBase = treq->tr_node.io_Device;
Printf( "This test will compare the old CopyMem/CopyMemQuick routines with\n"
"the new ones you have installed. A great variety of tests will be\n"
"run, and this might take some time, especially if your system has a\n"
"slow processor.\n\n"
"Initiating test (please be patient...)\n\n");
if ((!(buf1 = (char *)malloc(65540)))
|| (!(buf2 = (char *)malloc(65540))))
{
Printf("Not enough memory to run test!\n");
return 10;
}
{
UWORD attnflags = SysBase->AttnFlags;
ULONG scalefactor;
if (attnflags & AFF_68040)
scalefactor = 0;
else if (attnflags & AFF_68030)
scalefactor = 1;
else if (attnflags & AFF_68020)
scalefactor = 2;
else if (attnflags & AFF_68010)
scalefactor = 3;
else scalefactor = 4;
testit(565 >> scalefactor,65536,S0_D0);
testit(147 >> scalefactor,65536,S0_D1);
testit(413 >> scalefactor,65536,S0_D2);
testit(147 >> scalefactor,65536,S0_D3);
testit(147 >> scalefactor,65536,S1_D0);
testit(382 >> scalefactor,65536,S1_D1);
testit(147 >> scalefactor,65536,S1_D2);
testit(501 >> scalefactor,65536,S1_D3);
testit(501 >> scalefactor,65536,S2_D0);
testit(147 >> scalefactor,65536,S2_D1);
testit(382 >> scalefactor,65536,S2_D2);
testit(147 >> scalefactor,65536,S2_D3);
testit(147 >> scalefactor,65536,S3_D0);
testit(413 >> scalefactor,65536,S3_D1);
testit(147 >> scalefactor,65536,S3_D2);
testit(564 >> scalefactor,65536,S3_D3);
testit(33900 >> scalefactor,1024,S0_D0);
testit(9400 >> scalefactor,1024,S0_D1);
testit(24000 >> scalefactor,1024,S2_D2);
testit(196000 >> scalefactor,128,S0_D0);
testit(155000 >> scalefactor,128,S2_D2);
testit(588000 >> scalefactor,19,S0_D0);
testit(622000 >> scalefactor,18,S0_D0);
testit(663000 >> scalefactor,17,S0_D0);
testit(956000 >> scalefactor,16,S0_D0);
testit(1060000 >> scalefactor,8,S0_D0);
testit(1430000 >> scalefactor,4,S0_D0);
testit(2190000 >> scalefactor,1,S0_D0);
}
free(buf2);
free(buf1);
Printf("Total timing:\n-------------\n");
Printf("%s routines :%4ld.%02ld secs","Old",totold.tv_secs,totold.tv_micro / 10000);
Printf("\n");
Printf("%s routines :%4ld.%02ld secs","New",totnew.tv_secs,totnew.tv_micro / 10000);
Printf("\n");
{
unsigned long pctint,
hund1,
hund2;
struct timeval *time3 = &tim3,
*totalold = &totold;
time3->tv_secs = totalold->tv_secs;
time3->tv_micro = totalold->tv_micro;
SubTime(time3,&totnew);
if ((LONG)time3->tv_secs < 0)
{
time3->tv_secs = -((LONG)time3->tv_secs + 1);
time3->tv_micro = 1000000 - time3->tv_micro;
negative = TRUE;
}
else negative = FALSE;
hund2 = (time3->tv_secs * 100) + (time3->tv_micro / 10000);
hund1 = (totalold->tv_secs * 100) + (totalold->tv_micro / 10000);
pctint = hund2 * 100000 / hund1;
if ((pctint % 10) > 5)
pctint += 10;
pctint /= 10;
Printf("Total s%s\t:%4ld.%02ld %% ",(negative) ? "lowdown" : "peedup",pctint / 100,pctint % 100);
Printf("\n");
}
CloseDevice((struct IORequest *)treq);
DeleteExtIO((struct IORequest *)treq);
DeletePort(tport);
return 0;
}
#asm
xdef _donaught
xdef __cli_parse
xdef __wb_parse
_donaught:
__cli_parse:
__wb_parse:
rts
#endasm
void printoffset(unsigned short alignment)
{
Printf((alignment & 2) ? "even" : "long");
if (alignment & 1)
Printf("+1");
}
void testit(unsigned long loops,unsigned long bytes,long offset)
{
struct timeval *time1 = &tim1,
*time2 = &tim2,
*time3 = &tim3;
unsigned long pctint;
Printf("Copying %ld bytes %ld times (",bytes,loops);
buf3 = buf1 + ((offset & 0xC) >> 2);
buf4 = buf2 + (offset & 0x3);
printoffset((offset & 0xC) >> 2);
Printf(" -> ");
printoffset(offset & 0x3);
Printf(" offset)\n");
Forbid();
GetSysTime(time1);
{
#asm
movem.l a2-a3/a6/d4-d5,-(sp)
movea.l _naught,a2
movea.l _buf3,a3
movea.l _buf4,a6
move.l %%loops,d4
move.w d4,d5
swap d4
subq.w #1,d5
bcs.s l1end
loop1 movea.l a3,a0
movea.l a6,a1
move.l %%bytes,d0
jsr (a2)
dbf d5,loop1
l1end dbf d4,loop1
movem.l (sp)+,a2-a3/a6/d4-d5
#endasm
}
GetSysTime(time3);
Permit();
SubTime(time3,time1);
Forbid();
GetSysTime(time1);
{
#asm
movem.l a2-a3/a6/d4-d5,-(sp)
movea.l _oldcms,a2
movea.l _buf3,a3
movea.l _buf4,a6
move.l %%loops,d4
move.w d4,d5
swap d4
subq.w #1,d5
bcs.s l2end
loop2 movea.l a3,a0
movea.l a6,a1
move.l %%bytes,d0
jsr (a2)
dbf d5,loop2
l2end dbf d4,loop2
movem.l (sp)+,a2-a3/a6/d4-d5
#endasm
}
GetSysTime(time2);
Permit();
SubTime(time2,time1);
SubTime(time2,time3);
AddTime(&totold,time2);
timold.tv_secs =
timdif.tv_secs = time2->tv_secs;
timold.tv_micro =
timdif.tv_micro = time2->tv_micro;
Printf("Old CopyMem%s: %2ld.%02ld secs\n","\t",time2->tv_secs,time2->tv_micro / 10000);
Forbid();
GetSysTime(time1);
{
#asm
movem.l a2-a3/a6/d4-d5,-(sp)
movea.l _newcms,a2
movea.l _buf3,a3
movea.l _buf4,a6
move.l %%loops,d4
move.w d4,d5
swap d4
subq.w #1,d5
bcs.s l3end
loop3 movea.l a3,a0
movea.l a6,a1
move.l %%bytes,d0
jsr (a2)
dbf d5,loop3
l3end dbf d4,loop3
movem.l (sp)+,a2-a3/a6/d4-d5
#endasm
}
GetSysTime(time2);
Permit();
SubTime(time2,time1);
SubTime(time2,time3);
AddTime(&totnew,time2);
SubTime(&timdif,time2);
if ((LONG)timdif.tv_secs < 0)
{
timdif.tv_secs = -((LONG)timdif.tv_secs + 1);
timdif.tv_micro = 1000000 - timdif.tv_micro;
negative = TRUE;
}
else negative = FALSE;
Printf("New CopyMem%s: %2ld.%02ld secs","\t",time2->tv_secs,time2->tv_micro / 10000);
pctint = ((timdif.tv_secs * 100) + (timdif.tv_micro / 10000)) * 10000
/ ((timold.tv_secs * 100) + (timold.tv_micro / 10000));
if ((pctint % 10) > 5)
pctint += 10;
pctint /= 10;
Printf(" (%s%2ld.%ld%%)\n",(negative) ? "+" : "-",pctint / 10,pctint % 10);
if ((!offset) && (!(bytes % 4)))
{
Forbid();
GetSysTime(time1);
{
#asm
movem.l a2-a3/a6/d4-d5,-(sp)
movea.l _oldcmq,a2
movea.l _buf3,a3
movea.l _buf4,a6
move.l %%loops,d4
move.w d4,d5
swap d4
subq.w #1,d5
bcs.s l4end
loop4 movea.l a3,a0
movea.l a6,a1
move.l %%bytes,d0
jsr (a2)
dbf d5,loop4
l4end dbf d4,loop4
movem.l (sp)+,a2-a3/a6/d4-d5
#endasm
}
GetSysTime(time2);
Permit();
SubTime(time2,time1);
SubTime(time2,time3);
AddTime(&totold,time2);
timold.tv_secs =
timdif.tv_secs = time2->tv_secs;
timold.tv_micro =
timdif.tv_micro = time2->tv_micro;
Printf("Old CopyMem%s: %2ld.%02ld secs\n","Quick",time2->tv_secs,time2->tv_micro / 10000);
Forbid();
GetSysTime(time1);
{
#asm
movem.l a2-a3/a6/d4-d5,-(sp)
movea.l _newcmq,a2
movea.l _buf3,a3
movea.l _buf4,a6
move.l %%loops,d4
move.w d4,d5
swap d4
subq.w #1,d5
bcs.s l5end
loop5 movea.l a3,a0
movea.l a6,a1
move.l %%bytes,d0
jsr (a2)
dbf d5,loop5
l5end dbf d4,loop5
movem.l (sp)+,a2-a3/a6/d4-d5
#endasm
}
GetSysTime(time2);
Permit();
SubTime(time2,time1);
SubTime(time2,time3);
AddTime(&totnew,time2);
SubTime(&timdif,time2);
if (negative = ((LONG)timdif.tv_secs < 0))
{
timdif.tv_secs = -((LONG)timdif.tv_secs + 1);
timdif.tv_micro = 1000000 - timdif.tv_micro;
}
Printf("New CopyMem%s: %2ld.%02ld secs","Quick",time2->tv_secs,time2->tv_micro / 10000);
pctint = ((timdif.tv_secs * 100) + (timdif.tv_micro / 10000)) * 10000
/ ((timold.tv_secs * 100) + (timold.tv_micro / 10000));
if ((pctint % 10) > 5)
pctint += 10;
pctint /= 10;
Printf(" (%s%2ld.%ld%%)\n",(negative) ? "+" : "-",pctint / 10,pctint % 10);
}
Printf("\n");
}